import java.util.*;
public class Demo03 {
//    4. 二叉树的层序遍历 II
//    给你二叉树的根节点 root ，返回其节点值 自底向上的层序遍历 。 （即按从叶子节点所在层到根节点所在的层，逐层从左向右遍历）
//    示例 1：
//    输入：root = [3,9,20,null,null,15,7]
//    输出：[[15,7],[9,20],[3]]
//    示例 2：
//    输入：root = [1]
//    输出：[[1]]
//    示例 3：
//    输入：root = []
//    输出：[]
//
//    public List<List<Integer>> levelOrderBottom(TreeNode root) {
//        List<List<Integer>> list = new ArrayList<>();
//        if (root == null) {
//            return list;
//        }
//        Queue<TreeNode> queue = new LinkedList<>();
//        queue.offer(root);
//        while (!queue.isEmpty()) {
//            List<Integer> tmp = new ArrayList<>();
//            int size = queue.size();
//            while (size-- != 0) {
//                TreeNode cur = queue.poll();
//                tmp.add(cur.val);
//                if (cur.left != null) {
//                    queue.offer(cur.left);
//                }
//                if (cur.right != null) {
//                    queue.offer(cur.right);
//                }
//            }
//            list.add(0,tmp);
//        }
//        return list;
//    }




//    5. 二叉树的层序遍历
//    给你二叉树的根节点 root ，返回其节点值的 层序遍历 。 （即逐层地，从左到右访问所有节点）。
//    示例 1：
//    输入：root = [3,9,20,null,null,15,7]
//    输出：[[3],[9,20],[15,7]]
//    示例 2：
//    输入：root = [1]
//    输出：[[1]]
//    示例 3：
//    输入：root = []
//    输出：[]

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root == null) {
            return list;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> tmp = new ArrayList<>();
            while (size != 0) {
                TreeNode cur = queue.poll();
                System.out.print(cur.val + " ");
                tmp.add(cur.val);
                size--;
                if (cur.left != null) {
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                }
            }
            list.add(tmp);
        }
        return list;
    }
}






